package com.fz.us.admin.base.dao;

import com.fz.us.admin.base.bean.search.Search;
import com.fz.us.admin.base.bean.search.result.SearchResult;
import com.fz.us.admin.base.entity.MongoEntity;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.io.Serializable;
import java.util.List;

/**
 * Dao接口 - mongodb Dao基接口
 * ============================================================================
 * 版权所有 2016 。
 *
 * @author fallenpanda
 * @version 1.0 2016-07-13 。
 * ============================================================================
 */
public interface MongoBaseDao<T extends MongoEntity, PK extends Serializable> {

    /**
     * 通过条件查询实体(集合)
     *
     * @param query
     */
    public List<T> find(Query query) ;

    /**
     * 通过一定的条件查询一个实体
     *
     * @param query
     * @return
     */
    public T findOne(Query query) ;

    /**
     * 通过条件查询更新数据
     *
     * @param query
     * @param update
     * @return
     */
    public void update(Query query, Update update) ;

    /**
     * 保存一个对象到mongodb
     *
     * @param entity
     * @return
     */
    public T save(T entity) ;

    /**
     * 通过ID获取记录
     *
     * @param id
     * @return
     */
    public T findById(String id) ;

    /**
     * 通过ID获取记录,并且指定了集合名(表的意思)
     *
     * @param id
     * @param collectionName
     *            集合名
     * @return
     */
    public T findById(String id, String collectionName) ;

    /**
     * 求数据总和
     * @param query
     * @return
     */
    public long count(Query query);

    /**
     * 根据 Search 对象进行查询(提供分页、条件查找、排序功能).
     *
     * @param search
     * @return SearchResult
     */
    public SearchResult findBySearch(Search search);

}
